package com.jt;

import org.junit.Test;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;

public class SimpleTest {
	/*
	 * 测试方法,消息生产者
	 */
	@Test
	public void producter() throws Exception{
		//连接消息队列,ip,用户,密码,虚拟机
		ConnectionFactory factory=new ConnectionFactory();
		//设置工厂连接信息
		factory.setHost("192.168.253.129");
		factory.setPort(5672);
		factory.setUsername("jtadmin");
		factory.setPassword("123456");
		factory.setVirtualHost("/jt");// "/"不能缺少
		//获取连接 获取返回结果的快捷键 ctrl +shift+l
		Connection conn = factory.newConnection();
		//从一个连接可以获取多个信道channel,
		//connection的连接,基于底层tcp,长连接
		Channel chan = conn.createChannel();
		//连接绑定生成queue队列,如果在当前mq中存在,信道连接队列
		//不存在,信道会创建一个;
		String queue="simple1803";//
		//绑定信道和队列
		//参数含义
		//queue:String类型,表示绑定到信道的queue队列
		//durable: Boolean,是否持久化
		//exclusive Boolean,是否专属化,true,表示专属,当前连接conn
		//创建的任何channle都可以连接queue,其他不能用,
		//false,其他conn创建的可以连接
		//autoDelete: Boolean 是否在最后连接使用完成queue后删除队列
		//arguments:Map 其他参数;
		chan.queueDeclare(queue, false, false, false, null);
		//发送的消息
		String message="hello rabbitmq 1803";
		//exchange:简单模式下,名字,空字符串使用默认交
		//换机完成简单模式的消息发送
		//routingkey:简单模式,使用默认交换机 
		//queue名称就是默认的key
		//props:属性,BasicProperties,例如调用它的属性值,
		//设定与持久化相关的配置,BasicProperties.deliveryMode
		//0持久化,1不持久化,配合durable
		//body:byte数组形式的消息
		for(int i=0;i<100;i++){
			message=message+":"+i;
			chan.basicPublish("", queue, null, message.getBytes());
			
		}
		chan.close();
		conn.close();
	}
	/*
	 * 接收监听消息队列,消费者代码
	 */
	@Test
	public void consumer() throws Exception{
		//创建连接
		ConnectionFactory factory=new ConnectionFactory();
		//设置工厂连接信息
		factory.setHost("192.168.253.129");
		factory.setPort(5672);
		factory.setUsername("jtadmin");
		factory.setPassword("123456");
		factory.setVirtualHost("/jt");
		Connection conn = factory.newConnection();
		Channel chan = conn.createChannel();
		//绑定
		String queue="simple1803";
		chan.queueDeclare(queue, false, false, false, null);
		//创建一个消费者,将对象交给chan
		QueueingConsumer consumer=new QueueingConsumer(chan);
		//消费消息,利用chan,绑定消费者和队列
		//autoAck:自动确认,true,确认,false,消费完消息后需要手动
		//调用代码确认消费完毕;chan.ack,chan.nack,chan.basicReject
		chan.basicConsume(queue, true,consumer);
		//获取消息队列中的消息
		//循环监听
		while(true){
			//拿到消息封装对象
			Delivery dli=consumer.nextDelivery();
			//从dli获取消息,byte数组
			String msg=new String(dli.getBody());
			System.out.println(msg);
		}
		
		
	
	}
	
	
	
	
	
	
	
	
	
	
}
